package yourapp.expense.entity;
/**
 * 每个支出记录都必须关联一个用途分类，这样可以对消费进行归类分析
 *
@author YourName
@version 1.0
@since 2024
*/
public class PurposeCategory {
  /**
   * 用途分类的唯一标识符（主键）
   * 在Java对象中，我们使用驼峰命名法(purposeCategoryId)，而数据库中用的是下划线分隔:purpose_category_id
   */
  private int purposeCategoryId;
  //在数据库中有长度限制(NVARCHAR(50))，所以这里也要进行长度验证
  private String name;

  /**
   * 默认无参构造方法
   *
   * <p>这个构造方法是必须的，因为：
   * 1. Java Bean规范要求有空构造方法
   * 2. 很多框架（如Hibernate、Jackson）需要通过反射创建对象实例
   * 3. 在序列化/反序列化时需要</p>
   */
  public PurposeCategory() {}

  public PurposeCategory(int purposeCategoryId, String name) {
    this.purposeCategoryId = purposeCategoryId;
    this.name = name;
  }

  // Getter和Setter方法
  public int getPurposeCategoryId() { return purposeCategoryId; }
  public void setPurposeCategoryId(int purposeCategoryId) {
    // 基础验证：ID应该是非负数
    if (purposeCategoryId < 0) {
      throw new IllegalArgumentException("用途分类ID不能为负数");
    }
    this.purposeCategoryId = purposeCategoryId;
  }

  public String getName() { return name; }
  public void setName(String name) {
    // 数据验证：名称不能为null或空字符串
    if (name == null || name.trim().isEmpty()) {
      throw new IllegalArgumentException("用途分类名称不能为空");
    }

    // 数据验证：名称长度不能超过数据库限制(50个字符)
    if (name.trim().length() > 50) {
      throw new IllegalArgumentException("用途分类名称长度不能超过50个字符");
    }

    this.name = name.trim(); // 去除前后空格后赋值
  }

  // toString方法（用于测试）
  @Override
  public String toString() {
    // 使用String.format进行格式化，提高可读性
    return String.format("PurposeCategory{id=%d, name='%s'}",
        purposeCategoryId, name);
  }
}

